package com.design.factory.general;

public class SenderFactory {

	/***
	 * 普通工厂模式，缺陷在于入参不准确则无法正常运行
	 * @param type
	 * @return
	 */
	public Sender produce(String type) {
		
		if("mail".equals(type)) {
			
			return new MailSender();
			
		}else if("sms".equals(type)) {
			
			return new SmsSender();
		}else {
			
			return null;
		}
	}
	
	/**
	 * 多个工厂方法模式，不同方法返回不同的实例对象
	 * @return
	 */
	public Sender produceMail() {
		
		return new MailSender();
	}
	/**
	 * 多个工厂方法模式，不同方法返回不同的实例对象
	 * @return
	 */
	public Sender produceSms() {
		
		return new SmsSender();
	}
	
	
	/**
	 * 静态工厂方法
	 * @return
	 */
	public static Sender produceMailO() {
		
		return new MailSender();
	}
	/**
	 * 静态工厂方法
	 * @return
	 */
	public static Sender produceSmsO() {
		
		return new SmsSender();
	}
	
	
	public static class FactoryTest {
		
		public static void main(String[] args) {
			
/*			SenderFactory factory = new SenderFactory();
			Sender send = null;*/
			//普通工厂方法
			//send = factory.produce("mail");
			
			//多个工厂方法模式
			//send = factory.produceSms();
			
			//静态工厂方法
/*			Sender send = SenderFactory.produceMailO();
			
			send.send();*/
			
			///抽象工厂模式，特点：拓展性强，符合开闭原则
			Provider pv = new MailSendFactory();
			
			Sender send = pv.produce();
			
			send.send();
			
		}
	}
}
